#include "minimusic.h"
#include "ui_minimusic.h"
#include <QMouseEvent>
#include <QPoint>
#include <QWidget>
#include <QResizeEvent>
#include <QGraphicsDropShadowEffect>
#include <QPainter>
#include <QTimer>
#include <QString>
#include <QJsonObject>
#include <QDebug>
MiniMusic::MiniMusic(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MiniMusic)
{
    ui->setupUi(this);

    // 一直要初始化
    initUI();

    conncectSignalAndSlots();

    // 选择默认本地下载页
    ui->stackedWidget->setCurrentIndex(4);

}
MiniMusic::~MiniMusic()
{
    delete ui;
}


void MiniMusic::initUI()
{
    // 设置无边框窗口，即窗口将来没有标题栏
    setWindowFlag(Qt::FramelessWindowHint);

    // 设置窗⼝背景透明
    this->setAttribute(Qt::WA_TranslucentBackground);

    // 给窗⼝设置阴影效果
    QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this);
    shadowEffect->setOffset(0,0); // 设置阴影偏移
    shadowEffect->setColor("#000000"); // 设置阴影颜⾊：⿊⾊
    shadowEffect->setBlurRadius(10); // 设置阴影的模糊半径
    ui->background->setGraphicsEffect(shadowEffect);
    this->setGraphicsEffect(shadowEffect);

    // 设置 BodyLeft 中6个btFrom的信息
    ui->Rec->section(":/images/rec.png","推荐",0);
    ui->music->section(":/images/music.png","音乐馆",1);
    ui->audio->section(":/images/radio.png","电台",2);
    ui->like->section(":/images/like.png","我喜欢",3);
    ui->local->section(":/images/local.png","本地下载",4);
    ui->recent->section(":/images/recent.png","最近播放",5);


    // 隐藏除了本地下载BtForm动画默认显⽰
    ui->Rec->hideAnimal();
    ui->music->hideAnimal();
    ui->audio->hideAnimal();
    ui->like->hideAnimal();
    ui->recent->hideAnimal();

    // 延迟设置样式（确保UI初始化完成） 直接在ui的全局设置应该也行
    QTimer::singleShot(100, this, &MiniMusic::delaySetLocalBackground);

    // 初始化推荐页面
    srand(time(NULL));
    ui->recMusicBox->initRecBoxUi(RandomPicture(),1);
    ui->supplyMusicBox->initRecBoxUi(RandomPicture(),2);

    ui->scrollArea->setWidgetResizable(true); // 确保内容自适应
    \
    // 设置我喜欢、本地音乐、最近播放页面
    ui->likePage->setCommonPageUI("我喜欢",":/images/ilikebg.png");
    ui->localPage->setCommonPageUI("本地音乐",":/images/localbg.png");
    ui->recentPage->setCommonPageUI("最近播放",":/images/recentbg.png");

    // 创建音量调节窗口对象并挂在对象树上
    volumnTool = new VolumeTool(this);
}

void MiniMusic::conncectSignalAndSlots()
{
    // ⾃定义的btFrom按钮点击信号，当btForm点击后，设置对应的堆叠窗⼝
    connect(ui->Rec, &BtForm::btClick, this, &MiniMusic::onBtFromClick);
    connect(ui->music, &BtForm::btClick, this, &MiniMusic::onBtFromClick);
    connect(ui->audio, &BtForm::btClick, this, &MiniMusic::onBtFromClick);
    connect(ui->like, &BtForm::btClick, this, &MiniMusic::onBtFromClick);
    connect(ui->local, &BtForm::btClick, this, &MiniMusic::onBtFromClick);
    connect(ui->recent, &BtForm::btClick, this, &MiniMusic::onBtFromClick);
}

void MiniMusic::delaySetLocalBackground()
{
    ui->local->setBackgroundColor();
}

// QString("0%1.png") 是模板字符串
// arg(i, 3, 10, QCchar('0'))
// i：要放⼊%1位置的数据
// 3: 三位数
// 10：表⽰⼗进制数
// QChar('0')：数字不够三位，前⾯⽤字符'0'填充
QJsonArray MiniMusic::RandomPicture()
{
    // 推荐文本 + 推荐图片路径
    QVector<QString> vectorImageName;
    for(int i = 1; i <= 40; ++i) {
        // 格式化为3位数字（不足补零）+ .png后缀
        QString imageName = QString("0%1.png").arg(i, 2, 10, QChar('0'));
        vectorImageName << imageName;
//        qDebug() << imageName;
    }

    std::random_shuffle(vectorImageName.begin(),vectorImageName.end());

    // 001.png
    // path: ":/images/rec/"+vectorImageName[i];
    QJsonArray objArray;
    for(int i = 0; i < vectorImageName.size(); ++i)
    {
        QJsonObject obj;
        obj.insert("path", ":/images/rec/"+vectorImageName[i]);

        QString strText = QString("推荐-0%1").arg(i, 2, 10, QChar('0'));
        obj.insert("text", strText);

        objArray.append(obj);
    }

    return objArray;
 }




void MiniMusic::mousePressEvent(QMouseEvent *event)
{
    // 拦截鼠标左键单击事件
    if (event->button() == Qt::LeftButton){
        // event->glovalPos(); 鼠标按下事件发生时，光标相对于屏幕左上角位置
        // fameGeometry().topLeft(): 鼠标按下事件发生时，窗口左上角的位置
        // geometry(): 不包括边框及顶部标题区的窗口范围
        // fameGeometry(): 包括边框及顶部标题区的窗口范围
        // 鼠标按下时， 窗口左上角和光标之间的距离差
        // 想要窗口鼠标按下时窗口移动，只需要在mouseMoveEvent中，让光标和窗⼝左上⻆保持相同的位置差
        // 获取⿏标相对于屏幕左上⻆的全局坐标
        // 因为我们上面设置了无边框窗口，所以使用frameGeometry() 和 geometry() 返回值一样
        dragPosition = event->globalPos() - frameGeometry().topLeft();
    } else {
        QWidget::mousePressEvent(event);
    }

}

void MiniMusic::mouseMoveEvent(QMouseEvent *event)
{
    // 这里使用了event->button()来判断鼠标按键状态，这是不正确的。
    // 而在鼠标移动事件里，它返回的是Qt::NoButton。
    // 应该使用event->buttons()（注意这里是复数形式）来判断鼠标按键状态，它能返回当前所有被按下的按键。
    if (event->buttons() == Qt::LeftButton){
        // 根据鼠标移动更新窗口位置
        move(event->globalPos() - dragPosition);
    } else{
        QWidget::mousePressEvent(event);
    }

}

void MiniMusic::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        // 可以在这里添加释放左键后的处理
        event->accept();
    } else {
            QWidget::mouseReleaseEvent(event);
    }
}




void MiniMusic::on_quit_clicked()
{
    close();
}

void MiniMusic::onBtFromClick(int pageId)
{
    //  1. 获取当前页面所有btFrom按钮类型的对象
    QList<BtForm*> buttonList = this->findChildren<BtForm*>();

    //  2.遍历所有对象, 如果不是当前id的按钮,则把之前设置的背景颜⾊清除掉
    for (auto btitem : buttonList) {
        if (pageId != btitem->getPageId()) {
            btitem->clearBackground();
        }
    }

    //  3.设置当前栈空间显示页面
    ui->stackedWidget->setCurrentIndex(pageId);
}

void MiniMusic::on_volume_clicked()
{
    // 先要调整窗口的显示位置，否则该窗口在主窗口的左上角
    // 1. 获取该按钮左上角的图标
    QPoint point = ui->volume->mapToGlobal(QPoint(0,0));

    // 2. 计算volume窗口的左上角位置->
    // 让该窗口显示在鼠标点击的正上方
    // 鼠标位置：减去窗口宽度的一半，以及高度恰好就是窗口的左上方
    QPoint volumeLeftTop = point - QPoint(volumnTool->width() / 2,
           volumnTool->height());

    // 微调窗⼝位置
    volumeLeftTop.setX(volumeLeftTop.x() + 15);
    volumeLeftTop.setY(volumeLeftTop.y() + 18);

    // 3. 移动窗口位置
    volumnTool->move(volumeLeftTop);

    // 4.将窗口显示出来
    volumnTool->show();

}
